// QPCoder.h	class QPCoder

#ifndef _KC_QP_CODER__H_2008_KC_
#define _KC_QP_CODER__H_2008_KC_

#include <iostream>
#include <vector>
#include <boost/utility.hpp>

namespace kc_sf
{

	class QPCoder : boost::noncopyable
	{
		public:

			bool encode( const std::string &input, std::string &output );
			void decode( const std::string &input, std::string &output);

		private:

			static const unsigned int QP_LINE_LENGTH = 76;

			// pomocnicze metody - dekoder
			std::vector<unsigned int> findEqual(const std::string &input) const;

			unsigned int checkHex( const std::string &input, unsigned int start, std::string &output ) const;  // zwraca pozycje w strumieniu od ktorej zaczyna sie tekst, ktory nalezy przekopiowac
			unsigned int ommitCrlf( const std::string &input, unsigned int start ) const;             // zwraca pozycje w strumieniu od ktorej zaczyna sie tekst, ktory nalezy przekopiowac
			unsigned int ommitTrailingContext( const std::string &input, unsigned int start ) const;  // zwraca pozycje w strumieniu od ktorej zaczyna sie tekst, ktory nalezy przekopiowac

			// wspolne
			bool isHex( char c ) const;
			bool isWsp( char c ) const;
			bool isCrlf( char c ) const;
			unsigned int hexToInt( char c ) const;
	};

}

#endif // _KC_QP_CODER__H_2008_KC_
